package com.util;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.*;

/**
 * 自定义的 JUL 使用工具类
 *
 * @author LJM
 * @date 2021/07/14
 */
public class MyJulUtil {

    /**
     * 默认 日志级别
     */
    private static final Level DEFAULT_LEVEL_INFO = Level.INFO;

    /**
     * 生成的日志 默认存放目录
     */
    private static final String PATH = "D:\\project\\Projects\\JavaFile\\journal\\jul\\";

    /**
     * 生成的日志 默认存放位置（目录 + 文件名 + 后缀）
     */
    private static final String DEFAULT_PATH = "D:\\project\\Projects\\JavaFile\\journal\\jul\\info.log";

    /**
     * 配置文件 存放位置（目录 + 文件名 + 后缀）
     */
    private static final String CONFIG_FILE_PATH = "D:\\project\\Projects\\JavaFile\\journal\\jul\\config\\logging.properties";

    /**
     * 自定义的日志配置文件 存放位置（目录 + 文件名 + 后缀）
     */
    private static final String CONFIG_FILE_RESOURCES_PATH = "D:\\project\\Projects\\java\\journal\\jul\\src\\main\\resources\\logging.properties";


    /**
     * 创建日志记录器 对象
     * 读取 自定义的配置文件
     *
     * @param configPath 配置文件路径
     * @param name       全限定类名 或 包名
     * @return 日志记录器 对象
     */
    public static Logger createLoggerByConfig(String name, String configPath) {

        Logger logger = null;
        try {
            InputStream input = new FileInputStream(configPath);
            // 获取日志管理器对象
            LogManager logManager = LogManager.getLogManager();
            // 读取配置文件
            logManager.readConfiguration(input);
            // 获取日志对象
            logger = Logger.getLogger(name);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return logger;
    }

    /**
     * 创建日志记录器 对象
     * 读取 自定义的配置文件
     *
     * @param name 全限定类名 或 包名
     * @return 日志记录器 对象
     */
    public static Logger createLoggerByConfig(String name) {
        return createLoggerByConfig(name, CONFIG_FILE_RESOURCES_PATH);
    }


    /**
     * 创建日志记录器 对象
     *
     * @param name 全限定类名 或 包名
     * @return 日志记录器 对象
     */
    public static Logger createLogger(String name) {
        return createLogger(name, DEFAULT_LEVEL_INFO);
    }

    /**
     * 创建日志记录器 对象
     *
     * @param name  全限定类名 或 包名
     * @param level 日志级别
     * @return 日志记录器 对象
     */
    public static Logger createLogger(String name, Level level) {
        // 获取日志对象
        Logger logger = Logger.getLogger(name);
        // 关闭系统默认配置
        logger.setUseParentHandlers(false);
        // 设置日志的具体级别
        logger.setLevel(level);

        return logger;
    }


    /**
     * 创建 控制台 处理程序
     *
     * @param logger          日志记录器 对象
     * @param simpleFormatter 格式转换 对象
     */
    public static void createConsoleHandler(Logger logger, SimpleFormatter simpleFormatter) {
        // 创建
        ConsoleHandler consoleHandler = new ConsoleHandler();
        // 设置日志的具体级别
        consoleHandler.setLevel(logger.getLevel());
        // 进行关联
        consoleHandler.setFormatter(simpleFormatter);
        logger.addHandler(consoleHandler);
    }

    /**
     * 创建 文件输出 处理程序
     *
     * @param logger          日志记录器 对象
     * @param simpleFormatter 格式转换 对象
     * @param fileName        文件名
     */
    public static void createFileHandler(Logger logger, SimpleFormatter simpleFormatter, String fileName) {

        try {
            // 创建
            FileHandler fileHandler = new FileHandler(PATH + fileName + ".log");
            // 进行关联
            fileHandler.setFormatter(simpleFormatter);
            logger.addHandler(fileHandler);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * 创建 文件输出 处理程序
     *
     * @param logger          日志记录器 对象
     * @param simpleFormatter 格式转换 对象
     */
    public static void createFileHandler(Logger logger, SimpleFormatter simpleFormatter) {
        createFileHandler(logger, simpleFormatter, "info");
    }

}
